#include "mainwindow.h"
#include <QDebug>
#include "ui_mainwindow.h"

//在 Qt 中，事件分发器(Event Dispatcher) 是一个核心概念，用于处理 GUI 应用程序中的事件。
//事件分发器负责将事件从一个对象传递到另一个对象，直到事件被处理或被取消。
//每个继承自 QObject类 或 QObject类 本身都可以在本类中重写 bool event(QEvent *e) 函数，来实现相关事件的捕获和拦截

//在 Qt 中，我们发送的事件都是传给了 QObject 对象，更具体点是传给了 QObject 对象的 event() 函数。
//所有的事件都会进入到这个函数里面，那么我们处理事件就要重写这个 event() 函数。
//event() 函数本身不会去处理事件，而是根据 事件类型（type值）调用不同的事件处理函数。
//事件分发器就是工作在应用程序向下分发事件的过程中

//事件分发器用于分发事件。在此过程中，事件分发器也可以做拦截操作。事件分发器主要是通过 bool event(QEvent *e) 函数来实现。
//其返回值为布尔类型，若为 ture，代表拦截，不向下分发。
//Qt 中的事件是封装在 QEvent类 中，在 Qt 助手中输入 QEvent 可以查看其所包括的事件类型
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::mousePressEvent(QMouseEvent *event)
{
    if (event->button() == Qt::LeftButton) {
        qDebug() << "鼠标左键被按下!";
    }
}

bool MainWindow::event(QEvent *event)
{
    if (event->type() == QEvent::MouseButtonPress) {
        qDebug() << "鼠标按下事件被拦截!";
        //返回true,代表自行处理事件,不向下面进行分发
        return true;
    }
    else if(event->type() == QEvent::KeyPress) {
        qDebug() << "键盘按下事件被拦截!";
        //返回true,代表自行处理事件,不向下面进行分发
        return true;
    }

    //其他事件交给父类处理(默认处理)
    return QWidget::event(event);
}

void MainWindow::keyPressEvent(QKeyEvent *event)
{
   qDebug() << event->key();
}

